package com.season.seasonStudy.javase.j_008_database;

import com.season.seasonStudy.javase.entity.Dept;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;


/**
 *########################################jdbc模板##########################################
 * 预编译jdbc链接总结：

怎么做？
	先开启驱动包divermanager（高速公路）
	再开启链接connection（大卡车）
	再开启运行statement（轮胎）
	再开启查找的结果集resultset（芯片）


 * （1）、驱动OracleDeiver这个类获取里边的高速公路DriverManager
 * （2）、高速公路装上人，装上url  Oracle的路径，获得大卡车Connection
 * （3）、大卡车先获得轮胎PreparedStatement，和轮胎上要执行的数据sql，preparedStatement用excutQuery（）方法获得结果集，即芯片；
 * （3、1）、芯片可以根据你获取的信息进行扣去不同的数据类型的数据，比如获得int类型的数据用getInt（）；
 * （3、2）、如果不需要查数据，只进行操作数据增删改查的话，就不用获得结果集，直接用preparedStatement。excutUpdata（）方法运行，
 *         运行结果是如果返回正值 就是运行成功，返回负值的话，就不成功。
 * （4）、不管上边什么情况，最后都得执行finally语句，里边是从后往前关闭你打开的所有东西！1、如果有resultSet，先关闭他。2、没有result
 *       关闭PreparedStatement。因为Statement st是preparedStatement的父类所以关闭它也是一样的）3、关闭大卡车Connection.4、
 *       高速公路不用关闭，已经驱动好了，就不用管了
 */
public class JdbcDemo {
	
	
	/**
	 * jdbc:sql包
	 * jdbc:java数据库database连接技术
	 * 
	 * Java程序：API 接口
	 * 			导入驱动包
	 * 
	 * 数据库：提供支持实现接口
	 * 		驱动包jar（不同数据库提供不同数据包）
	 * 方式：
	 * 	1 纯java式连接 （效率高）
	 *  2 os操作系统提供工具完成连接（操作系统跨数据库平台，效率差）(odbc)
	 * 	
	 * java---odbc---- jdk----os--odbc--- ---数据库
	 * 
	 * java连接模板
	 * 	类：
	 * 		DriverManager ：根据数据库驱动提供数据库连接
	 * 	接口：
	 * 		Connection 连接---创建执行sql命令的载体
	 * 
	 * 		Statement  执行sql命令 维护数据 增删改返回影响行数
	 * 				查询数据  返回结果集
	 * 
	 * 		PreparedStatement(statement的子接口执行sql命令)
	 * 			实用?方式传递数据，简单，安全，高效
	 * 
	 * 		ResultSet 查询结果集 
	 * 
	 */
	
	public static void main(String[] args) {
		List<Dept> dl = new ArrayList<>();
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			//you need	驱动类位置,url,user,password
			String driver = "oracle.jdbc.OracleDriver";
			String url = "jdbc:oracle:thin:@localhost:1521:orcl";
			String usr = "scott";
			String pwd = "123";
			String sql = "select * from dept";
			
			//加载驱动所在的类,加载之后会将信息给DriverManager
			//加载驱动，下面dm会用到的，不然那个管理者不知道用哪个驱动
			Class.forName(driver);
			
			//通过url,usr,pwd,DriverManager建立连接
			 conn = DriverManager.getConnection(url, usr, pwd);
			 
			//用sql语句获得PreparedStatement,将sql语句写入了,接下来就只差执行了
			 pstmt = conn.prepareStatement(sql);
			 
			//pstmt.executeQuery,执行操作,若获得结果集,那就找个ResultSet乘着
			 rs = pstmt.executeQuery();
			while (rs.next()) {//用rs.next()执行下一行,若无,则返回false
				//rs.getInt();获得执行的这一行的数据
				//里面可以写String(column的名字),或者是数据库中的列数(1开始)
				Dept dept = new Dept(rs.getInt("deptno"), rs.getString(2), rs.getString(3));
				dl.add(dept);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally{//在最后,需要关闭资源
			try {
				if (rs !=null)
					rs.close();
				if (pstmt !=null)
					pstmt.close();
				if (conn !=null)
					conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		for (Dept dept : dl) {
			System.out.println(dept);
		}
	}
}
